// Copyright (c) 2008, 2009, Hiroshi Tsujimura
// Some rights reserved.
// 
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// 
//  * Redistributions of source code must retain the above copyright notice,
//    this list of conditions and the following disclaimer.
//  * Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
//  * Neither the name of Oki Software Co., Ltd. nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. 

using System;
using System.Runtime.InteropServices;

[assembly: Tumblen3.Revision("$Header: /Tumblen3.root/Tumblen3/Tumblen3/InternetCache.cs 1     09/04/17 16:22 Tsujimura543 $")]
namespace Tumblen3
{
    #region InternetCache class
    public class InternetCache
    {
        /// <summary>
        /// Get a cache specified by URL
        /// </summary>
        public bool GetUrlCacheEntryInfo(string url, out INTERNET_CACHE_ENTRY_INFO info)
        {
            info = new INTERNET_CACHE_ENTRY_INFO();
            IntPtr pCacheInfo = IntPtr.Zero;
            UInt32 infoSize = 0;
            bool ret = GetUrlCacheEntryInfo(url, pCacheInfo, out infoSize);

            try
            {
                pCacheInfo = Marshal.AllocHGlobal((int)infoSize);
                ret = GetUrlCacheEntryInfo(url, pCacheInfo, out infoSize);
                if (ret == true)
                {
                    info =
                        (INTERNET_CACHE_ENTRY_INFO)Marshal.PtrToStructure(
                            pCacheInfo, typeof(INTERNET_CACHE_ENTRY_INFO));
                    return true;
                }
            }
            finally
            {
                if (pCacheInfo.ToInt32() > 0)
                {
                    try
                    {
                        Marshal.FreeHGlobal(pCacheInfo);
                    }
                    catch
                    {
                    }
                }
            }

            return false;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct FILETIME
        {
            public UInt32 dwLowDateTime;
            public UInt32 dwHighDateTime;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct INTERNET_CACHE_ENTRY_INFO
        {
            public UInt32 dwStructSize;
            public string lpszSourceUrlName;
            public string lpszLocalFileName;
            public UInt32 CacheEntryType;
            public UInt32 dwUseCount;
            public UInt32 dwHitRate;
            public UInt32 dwSizeLow;
            public UInt32 dwSizeHigh;
            public FILETIME LastModifiedTime;
            public FILETIME ExpireTime;
            public FILETIME LastAccessTime;
            public FILETIME LastSyncTime;
            public IntPtr lpHeaderInfo;
            public UInt32 dwHeaderInfoSize;
            public string lpszFileExtension;
            public UInt32 dwExemptDelta;
        };

        [DllImport("wininet.dll", SetLastError = true)]
        private static extern bool GetUrlCacheEntryInfo(
            string lpszUrlName, IntPtr lpCacheEntryInfo,
            out UInt32 lpdwCacheEntryInfoBufferSize);
    }
    #endregion
}
